home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / emulator / uae-0.000 / uae-0 / uae-0.6.0 / include / newcpu.h < prev    next >
C/C++ Source or Header  |  1996-06-12  |  4KB  |  161 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * MC68000 emulation
  5.   *
  6.   * Copyright 1995 Bernd Schmidt
  7.   */
  8.  
  9. extern int areg_byteinc[];
  10. extern int imm8_table[];
  11.  
  12. extern int broken_in;
  13.  
  14. typedef void cpuop_func(ULONG) REGPARAM;
  15.  
  16. struct cputbl {
  17.     cpuop_func *handler;
  18.     int specific;
  19.     UWORD opcode;
  20. };
  21.  
  22. extern struct cputbl smallcputbl[];
  23.  
  24. extern cpuop_func *cpufunctbl[65536];
  25. extern void op_illg(ULONG) REGPARAM;
  26.  
  27. typedef char flagtype; 
  28.  
  29. union flagu {
  30.     struct {
  31.     /* v must be at the start so that the x86 seto instruction
  32.      * changes the V flag. C must follow after V. */
  33.     char v;
  34.     char c;
  35.     char n;
  36.     char z;
  37.     } flags;
  38.     ULONG longflags;
  39. };
  40.  
  41. extern struct regstruct 
  42. {
  43.     ULONG d[8];
  44.     CPTR  a[8],usp;
  45.     UWORD sr;
  46.     flagtype t;
  47.     flagtype s;
  48.     flagtype x;
  49.     flagtype stopped;
  50.     int intmask;
  51.     ULONG pc;
  52.     UWORD *pc_p;
  53.     UWORD *pc_oldp;
  54.     
  55.     ULONG vbr,sfc,dfc;
  56. } regs;
  57.  
  58. #ifdef INTEL_FLAG_OPT
  59. extern union flagu intel_flag_lookup[256] __asm__ ("intel_flag_lookup");
  60. extern union flagu regflags __asm__ ("regflags");
  61. #else
  62. extern union flagu regflags;
  63. #endif
  64.  
  65. #define ZFLG (regflags.flags.z)
  66. #define NFLG (regflags.flags.n)
  67. #define CFLG (regflags.flags.c)
  68. #define VFLG (regflags.flags.v)
  69.  
  70.  
  71. extern void MC68000_oldstep(UWORD opcode);
  72.  
  73. static __inline__ UWORD nextiword(void)
  74. {
  75.     UWORD r = *regs.pc_p++;
  76.     return r;
  77. }
  78.  
  79. static __inline__ ULONG nextilong(void)
  80. {
  81.     ULONG r = *regs.pc_p++;
  82.     r = (r << 16) + *regs.pc_p++;
  83.     return r;
  84. }
  85.  
  86. static __inline__ void m68k_setpc(CPTR newpc)
  87. {
  88.     regs.pc = newpc;
  89.     regs.pc_p = regs.pc_oldp = get_real_address(newpc);
  90. }
  91.  
  92. static __inline__ CPTR m68k_getpc(void)
  93. {
  94.     return regs.pc + ((char *)regs.pc_p - (char *)regs.pc_oldp);
  95. }
  96.  
  97. static __inline__ void m68k_setstopped(int stop)
  98. {
  99.     regs.stopped = stop;
  100.     if (stop)
  101.     specialflags |= SPCFLAG_STOP;
  102. }
  103.  
  104. static __inline__ int cctrue(const int cc)
  105. {
  106.     switch(cc){
  107.      case 0: return 1;                       /* T */
  108.      case 1: return 0;                       /* F */
  109.      case 2: return !CFLG && !ZFLG;          /* HI */
  110.      case 3: return CFLG || ZFLG;            /* LS */
  111.      case 4: return !CFLG;                   /* CC */
  112.      case 5: return CFLG;                    /* CS */
  113.      case 6: return !ZFLG;                   /* NE */
  114.      case 7: return ZFLG;                    /* EQ */
  115.      case 8: return !VFLG;                   /* VC */
  116.      case 9: return VFLG;                    /* VS */
  117.      case 10:return !NFLG;                   /* PL */
  118.      case 11:return NFLG;                    /* MI */
  119.      case 12:return NFLG == VFLG;            /* GE */
  120.      case 13:return NFLG != VFLG;            /* LT */
  121.      case 14:return !ZFLG && (NFLG == VFLG); /* GT */
  122.      case 15:return ZFLG || (NFLG != VFLG);  /* LE */
  123.     }
  124.     abort();
  125.     return 0;
  126. }
  127.  
  128. #if CPU_LEVEL > 1
  129. extern ULONG get_disp_ea (ULONG, UWORD);
  130.  
  131. #else
  132. static __inline__ ULONG get_disp_ea (ULONG base, UWORD dp)
  133. {
  134.     int reg = (dp >> 12) & 7;
  135.     LONG regd;
  136.     
  137.     if (dp & 0x8000)
  138.     regd = regs.a[reg];
  139.     else
  140.     regd = regs.d[reg];
  141.     if (!(dp & 0x800))
  142.     regd = (LONG)(WORD)regd;
  143.     return base + (BYTE)(dp) + regd;
  144. }
  145. #endif
  146.  
  147. extern void MakeSR(void);
  148. extern void MakeFromSR(void);
  149. extern void Exception(int);
  150. extern void m68k_move2c(int, ULONG *);
  151. extern void m68k_movec2(int, ULONG *);
  152. extern void m68k_divl (UWORD, ULONG, UWORD);
  153. extern void m68k_mull (UWORD, ULONG, UWORD);
  154. extern void init_m68k (void);
  155. extern void MC68000_step(void);
  156. extern void MC68000_run(void);
  157. extern void MC68000_skip(CPTR);
  158. extern void MC68000_dumpstate(CPTR *);
  159. extern void MC68000_disasm(CPTR,CPTR *,int);
  160. extern void MC68000_reset(void);
  161.